mod ast;
mod lexer;
mod parser;
mod token;

fn main() {
   // let input = "if, else, true, false, age, a_name, 3.2 + (1 - 5) ^ 2 * (10 - 4) / 24e-1 ";
   // let input = "3 + 4 * 2e-1 / (1 - 5) ^ 2";
   // let input = "3 + 4 * 5";
   // let input = "(3 + 4) * 5";
   // let input = "3 * (5 +3)";
   // let input = "3.2 + 3 ^ 2";
   let input = "2 + (-3 + 4)";
   println!("Code: {input}");

   let mut lexer = lexer::Lexer::new(input);
   let mut tokens = Vec::new();
   while let Some(token) = lexer.next_token() {
      // println!("Token: {token:?}");
      tokens.push(token);
   }

   // 为每个运算符分配优先级数值和结合性规则：
   // 运算符	优先级	结合性
   // ^	       4	    右结合
   // * /	     3	    左结合
   // + -	     2	    左结合
   // ( )	     0	   特殊处理
   let mut parser = parser::Parser::from_input(input);
   let program = parser.parse();
   println!("Ast: {program:#?}");
   // let mut ast = ast::Ast::new();
   // while let Some(stmt) = &program {
   //    ast.add_statement(stmt.clone());
   // }
   // ast.visualize();
}
